#include <list>
#include <iostream>
#include <algorithm>

using namespace std;

#define PRINT_SIZE(x) do {\
    cout << "size=" << x.size() << endl; \
} while (0)

int main()
{
    int i;
    list<int> ilst;
    PRINT_SIZE(ilst);   // size=0

    for (int i = 0; i < 5; ++i) ilst.push_back(i);
    PRINT_SIZE(ilst);   // size=5

    decltype(ilst.begin()) ite;
    for (ite = ilst.begin(); ite != ilst.end(); ++ite) {
        cout << *ite << ' ';
    }
    cout << endl;

    ite = find(ilst.begin(), ilst.end(), 3);
    if (ite != ilst.end())
        ilst.insert(ite, 99);
    
    PRINT_SIZE(ilst);   // size=6
    cout << *ite << endl;   // 3

    for (ite = ilst.begin(); ite != ilst.end(); ++ite)
        cout << *ite << ' ';    // 0 1 2 99 3 4
    cout << endl;

    ite = find(ilst.begin(), ilst.end(), 1);
    if (ite != ilst.end())
        cout << *(ilst.erase(ite)) << endl; // 2
    
    for (ite = ilst.begin(); ite != ilst.end(); ++ite)
        cout << *ite << ' ';    // 0 2 99 3 4
    cout << endl;
    
    ite = find(ilst.begin(), ilst.end(), 99);
    ilst.splice(ite, ilst);
    for (auto i : ilst) {
        cout << i << ' ';
    }
    cout << endl;
    return 0;
}